トランザクションの独立性により、データ・ストアへの同時接続が複数あったとしても、システムでは一度に1つのトランザクションを処理するように見えるアプリケーションを実現できます。アプリケーションは、Isolation接続属性を使用して、接続の分離レベルを設定できます。同時接続では、異なる分離レベルを使用できます。
次に分離レベルを示します。
図5.2に示すように、分離レベルと同時実行性は反比例します。分離レベルが低いほど、同時実行性は高まりますが、データの非一貫性のリスクが増大します。分離レベルが高いほど、データ一貫性の度合いは高まりますが、同時実行性は損なわれます。
図5.2 分離レベルと同時実行性の関係
アプリケーションでコミット読取り分離レベルを使用する場合、読取りアクセスには書込みデータの個別のコピーが存在するため、ロックは必要ありません。コミット読取り分離レベルでは、すべての問合せをブロックせず、シリアライズ可能分離レベルとの連携処理が可能です。書込みアクセスは、他の書込みアクセスとコミット読取り分離レベルの読取りアクセスのみをブロックします。コミット読取り分離レベルはデフォルトの分離レベルです。
図5.3 コミット読取り分離レベル
読取りアクセスは書込みアクセスをブロックせず、書込みアクセスは読取りアクセスをブロックしないため、コミット読取り分離レベルは同時実行性を高めることができます。この分離レベルは、スキャン中の行にアクセスする必要がある他の処理と競合する可能性がある、スキャンの実行時間が長いアプリケーションにとって有効です。ただし、この分離レベルを使用する場合のデメリットは、トランザクション内で、あるいは単一の文(たとえば、ネステッド結合の内部ループ)であっても、複数の非リピータブル・リードが可能であることです。
この分離レベルを使用している場合、表を操作するDDL文は、その表に対する読取りアクセスと書込みアクセスをブロックできます。たとえば、アプリケーションで表の行を読み取ろうとしても、別のアプリケーションにその表に対してコミットしていないDROP TABLE、DROP INDEX、またはALTER TABLE操作が存在すると、読取りを実行できません。さらに、ブロッキング・チェックポイントによって、読取りアクセスと書込みアクセスがブロックされます。
コミット読取り分離レベルでは、マテリアライズド・ビューとそれらのディテール表との一貫性を保証するために、マテリアライズド・ビューのメンテナンス中に必要となる読取りロックを設定します。これらのロックは、トランザクションの終了まで保持されませんが、かわりにメンテナンスが完了した時点(たとえば、ディテール表への更新が成功または失敗したことが示された時点)で解放されます。
アプリケーションでシリアライズ可能分離レベルを使用する場合、ロックはトランザクション内で取得され、トランザクションのコミットまたはロールバックまで保持されます。この分離レベルは、同時実行性を低下させて、トランザクション内のリピータブル・リードと独立性の向上を実現します。データ・ストア・レベル・ロックが選択されている場合、トランザクションでは、シリアライズ可能分離レベルが使用されます。
図5.4 シリアライズ可能分離レベル
シリアライズ可能分離レベルは、最強の分離レベルを必要とするトランザクションに有効です。また、シリアライズ可能分離レベルは、デッドロックを削減します。ただし、読取りロックはトランザクションがコミットするまで保持されるため、トランザクションによって読み取られるデータを変更する必要がある同時実行アプリケーションでは、ロック・タイムアウトが発生する可能性があります。